﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Bibilioteca.DataAccess
{
    class SociosDao : DaoBase
    {
        public const int modoConsultaOr = 0;
		public const int modoConsultaAnd = 1;
		
		public int paramID;
		
        public string nombre;
		public string apellido;
		public string domicilio;
		public string mail;
		
        public int habilitado;
		
		public SociosDao()
		{
			reiniciarParams();
		}
		
        /*
         * Establece los valores iniciales para los parametros.
         */
		private void reiniciarParams()
		{
			paramID = -1;
			nombre = "";
			apellido = "";
			domicilio = "";
			mail = "";
			habilitado = -1;
		}


        /*
		 * Genera un arreglo de parametros y la parte 'where' de la consulta,
		 * todo esto a partir de las variables globales que utilizamos como
		 * parametros.
		 * El parametro separador puede ser or o and.
		 
		private string generarParametros(int modo)
		{
			string where = "";
			bool primerParametro = true;
			string separador = "";
			string separador2 = "";
			
			switch(modo)
			{
				case 0 :	separador = " or "; //CONSULTA OR
							separador2 = " like '%' + ";
							break;
				case 1 :	separador = " and "; //CONSULTA AND
							separador2 = " like '%' + ";
							break;
				case 2 :	separador = " , "; //CONSULTA UPDATE
							separador2 = " = ";
							break;
			}
			
			LinkedList<DbParameter> param = new LinkedList<DbParameter>();
			
			if(paramID != -1)
			{	
                param.AddLast(new DbParameter("param_socio_id", SqlDbType.Int, paramID));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_id "+separador2+" @param_socio_id";
			}
			
			if(usuario.Length>0)
			{	param.AddLast(new DbParameter("param_socio_user", SqlDbType.VarChar, usuario));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_user "+separador2+" @param_socio_user";
			}
			
			if(pass.Length>0)
			{	param.AddLast(new DbParameter("param_socio_pass", SqlDbType.VarChar, pass));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_pass "+separador2+" @param_socio_pass";
			}
			
			if(nombre.Length>0)
			{	param.AddLast(new DbParameter("param_socio_nombre", SqlDbType.VarChar, nombre));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_nombre "+separador2+" @param_socio_nombre";
			}
			
			if(apellido.Length>0)
			{	param.AddLast(new DbParameter("param_socio_apellido", SqlDbType.VarChar, apellido));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_apellido "+separador2+" @param_socio_apellido";
			}
			
			if(domicilio.Length>0)
			{	param.AddLast(new DbParameter("param_socio_domicilio", SqlDbType.VarChar, domicilio));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_domicilio "+separador2+" @param_socio_domicilio";
			}
			
			if(mail.Length>0)
			{	param.AddLast(new DbParameter("param_socio_email", SqlDbType.VarChar, mail));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_email "+separador2+" @param_socio_email";
			}
			
			if(reservas != -1)
			{	param.AddLast(new DbParameter("param_socio_reservasActivas", SqlDbType.Int, reservas));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_reservasActivas "+separador2+" @param_socio_reservasActivas";
			}
			
			if(prestamos != -1)
			{	param.AddLast(new DbParameter("param_socio_prestamosActivos", SqlDbType.Int, prestamos));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_prestamosActivos "+separador2+" @param_socio_prestamosActivos"; 
			}
			
			if(esAdmin != -1)
			{	
				int valorAdmin = 0;
				if(esAdmin == 1)
					valorAdmin = 1;
				param.AddLast(new DbParameter("param_socio_esAdmin", SqlDbType.Bit,valorAdmin));
				if(primerParametro)
						primerParametro = false;
				else
					where += separador;
				where += "socio_esAdmin = @param_socio_esAdmin";	
			}
			
			if(param.Count>0)
			{
                parametros = new DbParameter[param.Count];

                for (int i = 0; i < param.Count; i++)
				{
                    parametros[i] = param.ElementAt(i);
				}
			}
			
			return where;
		}
        /**/

        /*
         * Retorna un DataTable con todos los socios y todos los campos
         * asociados a ellos.
         */
        public DataTable todosLosSocios()
        {
            /*string sql = "SELECT "+
              "s.socio_id 'Nro'"+
	          ",s.socio_user 'Usuario'"+
              ",s.socio_nombre 'Nombre'"+
              ",s.socio_apellido 'Apellido'"+
              ",s.socio_domicilio 'Domiclio' " +
              ",s.socio_email 'Mail' " +
              ",s.socio_reservasActivas 'Reservas Activas' " +
              ",s.socio_prestamosActivos 'Prestamos Activos' " +
              ",s.socio_esAdmin 'Admin'"+
              
              " FROM socios s";*/

            //string sql = "SELECT * FROM socios";
            string sql2 = "select * from socios s left join cuentas c on s.socio_id = c.cuenta_socio_id";
            return EjecutarQuery(sql2);
        }
		

		/*
		 * Dado un numero de socio, lo retorna.
		 */
        public DataTable GetSocioNumero()
        {
            string sql = "SELECT * FROM socios s where s.socio_id = @numero";
            DataTable retorno = EjecutarQuery(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }
		
		
		/*
		 * Busca los socios segun filtros generados.
		 * Modo puede ser modoConsultaOr o modoConsultaAnd.
		 * modoUpdate o modoInsert no se usan aca.
		 */
        public DataTable GetSocioFiltros(int modo)
		{
            string separador = " or "; //Consulta por defecto tipo OR.
            if (modo == 0) separador = " or ";
            else if (modo == 1) separador = " and ";

            string sql = "SELECT * FROM socios where ";

            bool primerParam = true; //Soy el primer parametro? sino me debe anteceder un AND o un OR

            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            if (paramID != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " socio_id = @socio_id ";
                parametrosList.AddLast(new DbParameter("socio_id", SqlDbType.Int, paramID));
            }
            
            if (nombre.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " socio_nombre like '%' + @socio_nombre ";
                parametrosList.AddLast(new DbParameter("socio_nombre", SqlDbType.VarChar, nombre));
            }

            if (apellido.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " socio_apellido like '%' + @socio_apellido ";
                parametrosList.AddLast(new DbParameter("socio_apellido", SqlDbType.VarChar, apellido));
            }

            if (domicilio.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " socio_domicilio like '%' + @socio_domicilio ";
                parametrosList.AddLast(new DbParameter("socio_domicilio", SqlDbType.VarChar, domicilio));
            }

            if (mail.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " socio_email like '%' + @socio_email ";
                parametrosList.AddLast(new DbParameter("socio_email", SqlDbType.VarChar, mail));
            }

            if (habilitado != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " socio_habilitado = @socio_habilitado ";
                parametrosList.AddLast(new DbParameter("socio_habilitado", SqlDbType.Bit, habilitado));
            }

            sql += "; ";
            
            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            DataTable retorno = new DataTable();
			
            if(parametrosList.Count>0)
                retorno = EjecutarQuery(sql, parametros1);
			
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
			return  retorno;
			
        }	


        public void insertarSocio()
        {
            string sql2 = "exec pa_insertar_socio ";			
			
			LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            string sql = "INSERT INTO socios ( ";
            string sqlParametros = "";
            
            if (nombre.Length > 1)
            {
                sql += "socio_nombre "; sqlParametros += " @socio_nombre";
                sql2 += ", @param_socio_nombre = @socio_nombre ";
                parametrosList.AddLast(new DbParameter("socio_nombre", SqlDbType.VarChar, nombre));
            }

            if (apellido.Length > 1)
            {
                sql += ",socio_apellido "; sqlParametros += ", @socio_apellido";
                sql2 += ", @param_socio_apellido = @socio_apellido ";
                parametrosList.AddLast(new DbParameter("socio_apellido", SqlDbType.VarChar, apellido));
            }

            if (domicilio.Length > 1)
            {
                sql += ",socio_domicilio "; sqlParametros += ", @socio_domicilio";
                sql2 += ", @param_socio_domicilio = @socio_domicilio ";
                parametrosList.AddLast(new DbParameter("socio_domicilio", SqlDbType.VarChar, domicilio));
            }

            if (mail.Length > 1)
            {
                sql += ",socio_email "; sqlParametros += ", @socio_email";
                sql2 += ", @param_socio_email = @socio_email ";
                parametrosList.AddLast(new DbParameter("socio_email", SqlDbType.VarChar, mail));
            }

            sql += ") VALUES ( "+sqlParametros+ ")";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1); //Se puede usar tb la variable sql que es la consulta tradicional
                                            //sql2 hace referencia al store procedure.

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void modificarSocio()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            bool primerParam = true;

            string sql = "UPDATE socios SET ";
            
            if (nombre.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "socio_nombre = @socio_nombre";
                parametrosList.AddLast(new DbParameter("socio_nombre", SqlDbType.VarChar, nombre));
            }

            if (apellido.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "socio_apellido = @socio_apellido";
                parametrosList.AddLast(new DbParameter("socio_apellido", SqlDbType.VarChar, apellido));
            }

            if (domicilio.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "socio_domicilio = @socio_domicilio";
                parametrosList.AddLast(new DbParameter("socio_domicilio", SqlDbType.VarChar, domicilio));
            }

            if (mail.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "socio_email = @socio_email";
                parametrosList.AddLast(new DbParameter("socio_email", SqlDbType.VarChar, mail));
            }

            
            if (this.habilitado != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "socio_habilitado = @socio_habilitado ";
                parametrosList.AddLast(new DbParameter("socio_habilitado", SqlDbType.Bit, habilitado));
            }
		    
            sql += " WHERE socio_id = @socio_id";

            parametrosList.AddLast(new DbParameter("socio_id", SqlDbType.Int, paramID));

			DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1);
			reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void eliminarSocio()
        {
            if (paramID != -1)
            {
                string sql = "DELETE FROM socios where socio_id = @numero";
                EjecutarUpdate(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });

                sql = "DELETE FROM cuentas where cuenta_socio_id = @numero";
                EjecutarUpdate(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });
                reiniciarParams();
            }
            
        }
    }
}
